package simpledb.storage;

import simpledb.execution.OpIterator;

import java.util.Iterator;
import java.util.NoSuchElementException;

/**
 * 实现 OpIterator 接口，封装一个 Tuple 的 Iterable 集合。
 * 可用于将一组元组包装成迭代器供执行引擎使用。
 */
public class TupleIterator implements OpIterator {

    private static final long serialVersionUID = 1L;

    // 当前使用的迭代器
    private Iterator<Tuple>   i                = null;

    // 元组描述信息，定义每个元组的字段结构
    private TupleDesc         td               = null;

    // 被封装的元组集合
    private Iterable<Tuple>   tuples           = null;

    /**
     * 构造一个新的 TupleIterator。
     *
     * @param td 元组的描述信息（字段类型和名称）
     * @param tuples 要遍历的元组集合
     */
    public TupleIterator(TupleDesc td, Iterable<Tuple> tuples) {
        this.td = td;
        this.tuples = tuples;

        // 检查所有元组是否具有与给定 TupleDesc 相同的结构
        for (Tuple t : tuples) {
            if (!t.getTupleDesc().equals(td))
                throw new IllegalArgumentException("tuple set 中包含不兼容的元组结构");
        }
    }

    /**
     * 打开迭代器，准备开始遍历。
     */
    public void open() {
        i = tuples.iterator();
    }

    /**
     * 判断是否还有下一个元组。
     *
     * @return 如果还有下一个元组返回 true，否则 false
     */
    public boolean hasNext() {
        return i.hasNext();
    }

    /**
     * 获取下一个元组。
     *
     * @return 下一个元组对象
     * @throws NoSuchElementException 如果没有更多元素
     */
    public Tuple next() {
        return i.next();
    }

    /**
     * 将迭代器重置为初始状态，重新开始遍历。
     */
    public void rewind() {
        close(); // 关闭当前迭代器
        open(); // 重新打开获取新的迭代器
    }

    /**
     * 获取该迭代器所处理的元组的描述信息。
     *
     * @return 元组描述对象
     */
    public TupleDesc getTupleDesc() {
        return td;
    }

    /**
     * 关闭迭代器，释放资源。
     */
    public void close() {
        i = null;
    }
}
